/* 1035:拼写检查 */
/*
描述
现在有一些英语单词需要做拼写检查，你的工具是一本词典。需要检查的单词，有的是词典中的单词，有的与词典中的单词相似，你的任务是发现这两种情况。单词A与单词B相似的情况有三种：
1、删除单词A的一个字母后得到单词B；
2、用任意一个字母替换单词A的一个字母后得到单词B；
3、在单词A的任意位置增加一个字母后得到单词B。
你的任务是发现词典中与给定单词相同或相似的单词。

输入
第一部分是词典中的单词，从第一行开始每行一个单词，以"#"结束。词典中的单词保证不重复，最多有10000个。
第二部分是需要查询的单词，每行一个，以"#"结束。最多有50个需要查询的单词。
词典中的单词和需要查询的单词均由小写字母组成，最多包含15个字符。
输出
按照输入的顺序，为每个需要检查的单词输出一行。如果需要检查的单词出现在词典中，输出“?x is correct"，?x代表需要检查的单词。如果需要检查的单词没有出现在词典中，则输出"?x: ?x1 ?x2 ...?xn"，其中?x代表需要检查的单词，?x1...?xn代表词典中与需要检查的单词相似的单词，这些单词中间以空格隔开。如果没有相似的单词，输出"?x:"即可。
*/


#include <iostream>
#include<cstdio>
#include<cstring>

char dic[10005][20],req[55][20];
int diclen[10005];
int count1;

bool find(int m,int n,int len){//m表示查找的第m个待查单词，n表示字典里的单词
    int t=len-diclen[n];
    int i,j;
    switch(t){
        case 0:i=0;
               while(dic[n][i]==req[m][i] && i<len) i++;
               if(i<len) i++;
               while(dic[n][i]==req[m][i] && i<len) i++;
               if(i==len) return 1;
               break;
        case 1:i=0;j=0;//i指向req,j指向dic
               while(dic[n][j]==req[m][i] && j<len-1){
                   i++;
                   j++;
               }
               if(j<len-1) i++;
               while(dic[n][j]==req[m][i] && j<len-1){
                   i++;
                   j++;
               }
               if(j==len-1) return 1;
               break;
        case -1:i=0;j=0;
                while(dic[n][j]==req[m][i] && i<len){
                    i++;
                    j++;
                }
                if(i<len) j++;
                while(dic[n][j]==req[m][i] && i<len){
                    i++;
                    j++;
                }
                if(i==len) return 1;
                break;
            }
    return 0;
}

int main(){
    //freopen("1035.in","r",stdin);
    //freopen("1035.out","w",stdout);
    int count2,n;
    scanf("%d\n",&n);
    for(int v=1;v<=n;v++){
    scanf("\n");
    count1=0;
    count2=0;
    do{
        scanf("%s",dic[count1]);
        count1++;
    } while(dic[count1-1][0]!='#');

    do{
        scanf("%s",req[count2]);
        count2++;
    } while(req[count2-1][0]!='#');

    for(int i=0;i<count1-1;i++) diclen[i]=strlen(dic[i]);

    for(int i=0;i<count2-1;i++){
        bool flag=0;
        int len=strlen(req[i]);
        for(int j=0;j<count1-1;j++){
            if(len==diclen[j] && strcmp(req[i],dic[j])==0){
                flag=1;
                printf("%s is correct\n",dic[j]);
                break;
            }
        }
        if(!flag){
            printf("%s:",req[i]);
            for(int j=0;j<count1-1;j++){
                if(find(i,j,len)) printf(" %s",dic[j]);
            }
            printf("\n");
        }
    }
    if(v!=n) printf("\n");
}
    return 0;
}

// Wrong Answer..... 我这里跑完没问题，按照示例输入结果正确。。。结果错误原因待查
